package grupobbva.pe.operhc.service;

import static grupobbva.pe.operhc.util.Constant.*;
import grupobbva.pe.operhc.dao.ConfigDAO;
import grupobbva.pe.operhc.dao.DisclamerDAO;
import grupobbva.pe.operhc.domain.Parametro;
import grupobbva.pe.operhc.util.GenericObject;

import java.io.File;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import org.apache.log4j.Logger;

import com.ibatis.dao.client.DaoManager;

public class DisclamerServiceImpl implements DisclamerService {
	
	private DaoManager daoMgr;
	private DisclamerDAO disclamerDAO;

	
	private static Logger logger = Logger.getLogger(ParametroServiceImpl.class);
	
	public DisclamerServiceImpl() {
		try {
			daoMgr       = ConfigDAO.getDaoManager();			
			disclamerDAO = (DisclamerDAO) daoMgr.getDao(DisclamerDAO.class);			
			
		} catch (Exception e) {
			logger.error(GenericObject.formatException(e));
		}
	}

	
	public void cargaDisclamerAutomatico(){
		List<Parametro> listaParametro=new ArrayList<Parametro>();

		try {
				logger.info("INICIO DisclamerServiceImpl JOB");
				Long idParametro=0L;
				 boolean TodoOk = true;			
		
				String stroFechaVerif = getFechaYYYYMMDD(0,"0");
				
					idParametro=disclamerDAO.validaCargaEnProceso(COD_MONITORJOB_DISCLAMER);	//para disparar un Job una sola vez									
				if (idParametro>0) {
	
					int  contador=0;				
					contador=disclamerDAO.validaCargaAutomatica(stroFechaVerif,ARCHIVO_DISCLAMER);
					
					 if (contador >0){ TodoOk = false;}					
					 if (TodoOk) {					
								
						 		listaParametro=disclamerDAO.getParametersByParameterType(TIPO_ARCHIVO_DISCLAMER);								
						 		String rutaCopy = getValorParametro(listaParametro,DIR_FILES_CPY_HOST);								
								String prefijoPrestamo =getValorParametro(listaParametro,PREFIJO_ARCHDISCLAMER);						
								String strExtension = getValorParametro(listaParametro,EXT_ARCHDISCLAMER);
								strExtension=strExtension.equals("")?"TXT":strExtension;
								String formatoFecha = getValorParametro(listaParametro,FORMATOFECHA_DISCLAMER);
								String formatoFechafinal=formatoFecha.equals("")?"yyyyMMdd":formatoFecha;								
								String activoFechacarga = getValorParametro(listaParametro,ACTIVO_FECHACARGA);	
								
								String strFechaProceso = getFechaYYYYMMDD(-1,"1");
								strFechaProceso=getFechaFormateado(strFechaProceso,formatoFechafinal);
								String fechaProcesoName=activoFechacarga.equals("1")?strFechaProceso:"";
								String strNombreArchivo = prefijoPrestamo + fechaProcesoName + "." + strExtension;
								String strNombreCompletoArchivo = rutaCopy + File.separator + strNombreArchivo;
								
								deleteArchivosAntiguos(rutaCopy,prefijoPrestamo,strExtension,formatoFechafinal);								
										
								boolean existsArchivo = (new File(strNombreCompletoArchivo)).exists();									
								if (existsArchivo)
								{			
									disclamerDAO.executeLoadDisclamer(strFechaProceso,strNombreArchivo,TIPOCARGA_AUTOMATICO);
								}
					 }
				
					 updateMonitorInactivo(COD_MONITORJOB_DISCLAMER);
				}
				
				logger.info("FIN DisclamerServiceImpl JOB");
			} catch (Exception e) {
				updateMonitorInactivo(COD_MONITORJOB_DISCLAMER);
				logger.error(e.getMessage(), e);
			}
	}
	
	public void executeLoadManual(String fechaProceso){
		List<Parametro> listaParametro=new ArrayList<Parametro>();

		try {
			logger.info("INICIO DisclamerServiceImpl manual JOB");	
			
			SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd/MM/yyyy");
			String strFecha = fechaProceso;
			Date dtFechaProceso = null;
			try {
				dtFechaProceso = formatoDelTexto.parse(strFecha);
			} catch (ParseException ex) {
				ex.printStackTrace();
			} 	
		   
			Calendar calendar = Calendar.getInstance();
			calendar.setTime(dtFechaProceso);
			String strDiaActual = "0" + calendar.get(Calendar.DATE);
			String strMes = "0" + (calendar.get(Calendar.MONTH) + 1);
			String strAno = "" + calendar.get(Calendar.YEAR);	
			String strFechaProceso = "";
			 strFechaProceso = strAno.substring(0, 4) + (strMes.substring(strMes.length() - 2))
						+ (strDiaActual.substring(strDiaActual.length() - 2));
			
		 	listaParametro=disclamerDAO.getParametersByParameterType(TIPO_ARCHIVO_DISCLAMER);								
	 		String rutaCopy = getValorParametro(listaParametro,DIR_FILES_CPY_HOST);								
			String prefijoPrestamo =getValorParametro(listaParametro,PREFIJO_ARCHDISCLAMER);						
			String strExtension = getValorParametro(listaParametro,EXT_ARCHDISCLAMER);
			strExtension=strExtension.equals("")?"TXT":strExtension;
			String formatoFecha = getValorParametro(listaParametro,FORMATOFECHA_DISCLAMER);
			String formatoFechafinal=formatoFecha.equals("")?"yyyyMMdd":formatoFecha;								
				
			strFechaProceso=getFechaFormateado(strFechaProceso,formatoFechafinal);
				
									
			String strNombreArchivo = prefijoPrestamo + strFechaProceso + "." + strExtension;
			String strNombreCompletoArchivo = rutaCopy + File.separator + strNombreArchivo;
			boolean existsArchivo = (new File(strNombreCompletoArchivo)).exists();
			
			if (existsArchivo)
			{			
				disclamerDAO.executeLoadDisclamer(strFechaProceso,strNombreArchivo,TIPOCARGA_MANUAL);

			}
			logger.info("FIN DisclamerServiceImpl manual JOB");
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
		}
	}
	
	private void updateMonitorInactivo(String strCodigo){
		try {
			disclamerDAO.updateMonitorInactivo(strCodigo);

		} catch (Exception ex) {				
			logger.error("Error al actualizar parametro monitor. " + ex.getMessage(), ex);
		}
	}	

	private String getFechaYYYYMMDD(int dias,String tipoFecha){	
		
		String strFechaYYYYMMDD = "";
		Calendar calendar = Calendar.getInstance();	
		if (tipoFecha=="1"){
			calendar.add(Calendar.DAY_OF_MONTH, dias);	
		}				
		String strDiaActual = "0" + (calendar.get(Calendar.DATE));
		String strMes = "0" + (calendar.get(Calendar.MONTH) + 1);
		String strAno = "" + calendar.get(Calendar.YEAR);		
		
		strFechaYYYYMMDD = strAno.substring(0, 4) + (strMes.substring(strMes.length() - 2))
					+ (strDiaActual.substring(strDiaActual.length() - 2));	
		
		return strFechaYYYYMMDD;
	}
	private int getdiasPermanencia(){
		int intMesPermanencia=90;
		try {
			
			String mespermanencia = disclamerDAO.getValParameterByCode(MES_PERMANENCIAFILE, TIPO_ARCHIVO_DISCLAMER);
			intMesPermanencia=(Integer.valueOf(mespermanencia==null?"3":mespermanencia))*30;
			if (intMesPermanencia==0){
				intMesPermanencia=90;
			}
		} catch (Exception e) {
			intMesPermanencia=90;						
		}
		return intMesPermanencia;
		
	}
	
	private void deleteArchivosAntiguos(String rutaCopy,String prefijoPrestamo,String strExtension,String formatoFechafinal){
					
		try {
			//ini delete archivos antiguos
			File filedel=null;
		    String strFechaProcesodel = getFechaYYYYMMDD(-(getdiasPermanencia()),"1")	;	
		    strFechaProcesodel=getFechaFormateado(strFechaProcesodel,formatoFechafinal);
			
			String strNombreArchivodel = prefijoPrestamo + strFechaProcesodel + "." +strExtension;
			String strNombreCompletoArchivodel = rutaCopy + File.separator + strNombreArchivodel;
			logger.info("DisclamerServiceImpl:deleteArchivosAntiguos:" +strNombreCompletoArchivodel);
			boolean existsArchivodel = (new File(strNombreCompletoArchivodel)).exists();
			
			if (existsArchivodel)
			{	
				String pathToFile=strNombreCompletoArchivodel;
				try {
					filedel = new File(pathToFile);
					filedel.delete();
				} catch (Exception ed) {
					logger.error("DisclamerServiceImpl:deleteArchivosAntiguos:"+ ed.getMessage());
				}
				
			}					
			//fin delete archivos antigios
			
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
		}	

	}
	
	private String getFechaFormateado(String fechaProceso,String formatoFecha ){
		
		
	String fechaFormateada=fechaProceso;	
	SimpleDateFormat formatoDelTexto = new SimpleDateFormat("yyyyMMdd");
	Date fechaPro;
	try {
		fechaPro = formatoDelTexto.parse(fechaProceso);
		String value=getEtiqueta(formatoFecha,fechaPro);
		fechaFormateada=value==null?fechaProceso:value;
	} catch (ParseException e) {
		fechaFormateada=fechaProceso;
	}		
	return fechaFormateada;
		
	}
	private Locale getDefaultLocale(){
		return new Locale("es","PE");
	}
	private String getEtiqueta(String formato,Date fecha){
		try{
			SimpleDateFormat sdf=new SimpleDateFormat(formato,getDefaultLocale());
			return sdf.format(fecha).toUpperCase();
		}catch (Exception e) {
			return null;
		}
	}
	
	private String getValorParametro(List<Parametro> listaParametro,String codParametro){
		String valorParametro="";
		if (listaParametro!=null && listaParametro.size()>0){
			for (Parametro oparametro: listaParametro){
				if (oparametro.getCodParametro().equals(codParametro)){				
					valorParametro=oparametro.getValParametro()==null?"":oparametro.getValParametro();
					break;
				}
			}
		}
		return valorParametro;		
	}

}
